package src.main.java.config;


import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import src.main.java.interceptor.LoginAuthInterceptor;
import src.main.java.properties.UserAuthProperties;

import javax.annotation.Resource;

/**
 * ***** 跨域问题
 *
 *  两个服务，前端vue服务、后端spring boot服务
 *  假设地址分别为
 *      vue ：         http://localhost:8080
 *      spring boot:  http://localhost:8081
 *
 *  什么是跨域？
 *      同源（非跨域）：协议（http）+域名（localhost）+端口（8080）均一致
 *      跨域即非同源
 *
 *  特点：
 *      服务端能收到请求并正常返回结果，只是结果被浏览器拦截
 *
 *  处理方法：
 *      1、目标方法添加注解：@CrossOrigin（粒度细，但是不能统一解决）
 *      2、配置类：注入一个包含corsConfiguration的对象
 *      3、实现WebMvcConfigurer接口的addCorsMappings方法，如下
 *      4、通过网关配置，在gateway的配置类中进行配置
 *
 * @author zm_ya
 */
@Component
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Resource
    private LoginAuthInterceptor loginAuthInterceptor ;

    @Resource
    private UserAuthProperties userAuthProperties ;


    /**
     * 拦截器注册
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginAuthInterceptor)
                // 排除不用拦截的路径
                .excludePathPatterns("/admin/system/index/login" ,
                        "/admin/system/index/generateValidateCode")
                .excludePathPatterns(userAuthProperties.getNoAuthUrls())
                // 添加拦截路径
                .addPathPatterns("/**");
    }


    /**
     * 允许跨域
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 添加路径规则
        registry.addMapping("/**")
                // 是否允许在跨域的情况下传递Cookie
                .allowCredentials(true)
                // 允许请求来源的域规则
                .allowedOriginPatterns("*")
                .allowedMethods("*")
                // 允许所有的请求头
                .allowedHeaders("*");
    }

}